/*******************************************************************************
版权声明: Copyright(C) HT-Tech Co., Ltd. 2020-2021. All rights reserved.
文件名称: htlist.h
文件描述: 链表操作
创 建 者: 陈位仅
创建时间: 2024年11月14日
修改历史:
1. 2024年11月14日    陈位仅      创建文件 
*******************************************************************************/
#ifndef _HTLIST__15882503819
#define _HTLIST__15882503819

// 链表最大长度
#define HT_LIST_MAX_LEN 1024

// 节点比较
typedef int CMP(void *a, void *b, int flag);
typedef void DESTORY(void *data);

struct list_node{
    struct list_node *next;  //下一节点
    void *data;              //节点内容
};

struct list_head{
    struct list_node *node;  //头节点
};

//************************************
// 接口名: list_init
// 返回值: 0 成功, -1 失败
// 参  数: nmb:节点个数
// 描  述: 创建表
//************************************
int list_init(int nmb);

//************************************
// 接口名: list_node_add
// 返回值: 0 成功, -1 失败
// 参  数: node:节点成员
//         index:表索引
// 描  述: 添加节点成员
//************************************
int list_node_add(struct list_node *node, unsigned int index);

//************************************
// 接口名: list_node_insert
// 返回值: 0 成功, -1 失败
// 参  数: node:节点成员
//         head:表
// 描  述: 添加节点成员到指定表
//************************************
int list_node_insert(struct list_node *node, struct list_head *head);

//************************************
// 接口名: list_node_del
// 返回值: 0 成功, -1 失败
// 参  数: data:关键字
//         func:数据对比函数
//         index:表索引
// 描  述:删除节点成员
//************************************
int list_node_del(void *data, CMP *func, int index);

//************************************
// 接口名: list_node_get
// 返回值: 节点 成功, NULL 失败
// 参  数: index:表索引
//         data:数据
//         func:数据对比函数
//         flag:数据对比标志
// 描  述: 根据数据内容查找节点
//************************************
struct list_node *list_node_get(int index, void *data, CMP *func, int flag);

//************************************
// 接口名: list_node_find
// 返回值: 节点 成功, NULL 失败
// 参  数: head:表
//         data:数据
//         func:数据对比函数
//         flag:数据对比标志
// 描  述: 根据数据内容在指定表中查找节点
//************************************
struct list_node *list_node_find(struct list_head *head, void *data, CMP *func, int flag);

//************************************
// 接口名: list_head_get
// 返回值: 节点 成功, NULL 失败
// 参  数: index:表索引
// 描  述: 获取指定序号的表
//************************************
struct list_head *list_head_get(int index);

//************************************
// 接口名: list_node_creat
// 返回值: 节点 成功, NULL 失败
// 参  数: data:数据
//         len:数据长度
// 描  述: 使用已有数据创建结点（数据拷贝）
//************************************
struct list_node *list_node_creat(void *data, int len);

//************************************
// 接口名: list_node_creat_withdata
// 返回值: 节点 成功, NULL 失败
// 参  数: data:数据
// 描  述: 使用已有数据创建结点
//************************************
struct list_node *list_node_creat_withdata(void *data);

//************************************
// 接口名: list_node_free
// 返回值: 无
// 参  数: node:节点
// 描  述: 结点内存释放
//************************************
void list_node_free(struct list_node *node);

//************************************
// 接口名: list_destory
// 返回值: 表头 成功, NULL 失败
// 参  数: func:节点数据回收函数
// 描  述: 使用节点数据回收接口销毁表
//************************************
void list_destory(DESTORY *func);

//************************************
// 接口名: list_head_destory
// 返回值: 表头 成功, NULL 失败
// 参  数: func:节点数据回收函数
//         head:表
// 描  述: 使用节点数据回收接口销毁指定表
//************************************
void list_head_destory(DESTORY *func, struct list_head *pHead);

#endif
